home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / data / happypas / hitblow.pas < prev    next >
Pascal/Delphi Source File  |  1993-11-30  |  4KB  |  131 lines

  1. {*********************************************************************
  2.  *  *** HIT & BLOW GAME ***                                          *
  3.  *                                                                   *
  4.  *        HAPPyのサンプルプログラム                                  *
  5.  *          (作者  浅野比富美 Public Domain Software)                *
  6.  *********************************************************************}
  7.  
  8. program HitAndBlow(input,output) ;
  9.  
  10.   label 999 ;                          { ギブアップ時のゲーム終了ラベル }
  11.  
  12.   type  kurai  = array[0..3] of 0..9 ; { 桁の分離用の位配列 }
  13.         HBsu   = 0..4 ;
  14.  
  15.   var   H      : HBsu    ;             { HIT  }
  16.         B      : HBsu    ;             { BLOW }
  17.         answer : integer ;             { 解答 }
  18.         Number : integer ;             { コンピュータの数字 }
  19.         time   : integer ;             { 回数 }
  20.  
  21.  {********** x行y桁にカーソルを移動する **********}
  22.   procedure gotoxy(x{行},y{桁}:integer);
  23.     type string = packed array[1..2] of char ;
  24.     var  strX,strY: string ;
  25.     procedure make(n:integer; var str: string);
  26.     begin
  27.       str[1] := chr(n div 10 + ord('0')) ;
  28.       str[2] := chr(n mod 10 + ord('0')) ;
  29.     end {make};
  30.   begin {gotoxy}
  31.     make(x,strX);
  32.     make(y,strY);
  33.     write(chr(27),'[',strX,';',strY,'H');
  34.   end {gotoxy};
  35.  
  36. {********** 4桁の数字nを各ketaに分離する **********}
  37.   procedure bunri(n:integer; var keta:kurai);
  38.   begin
  39.     keta[0] := (n mod 10000) div 1000 ;
  40.     keta[1] := (n mod 1000 ) div 100  ;
  41.     keta[2] := (n mod 100  ) div 10   ;
  42.     keta[3] :=  n mod 10
  43.   end {bunri};
  44.  
  45. {********** 重複しているか調べる **********}
  46.   function chofuku(n:integer) : Boolean ;
  47.     var k:kurai ;
  48.   begin
  49.     bunri(n,k) ;
  50.     chofuku := (k[0]=k[1]) or (k[0]=k[2]) or (k[0]=k[3]) or
  51.                (k[1]=k[2]) or (k[1]=k[3]) or (k[2]=k[3])
  52.   end { chofuku };
  53.  
  54. {********** HIT,BLOW を計算 **********}
  55.   procedure calcHB(No1,No2:integer; var hit,blow:HBsu);
  56.     var tk,qk : kurai ;
  57.         i,j   : 0..3  ;
  58.   begin
  59.     hit  := 0 ;
  60.     blow := 0 ;
  61.     bunri(No1,tk) ;        { No1を各桁に分離 }
  62.     bunri(No2,qk) ;        { No2を各桁に分離 }
  63.     for i:=0 to 3 do
  64.       for j:=0 to 3 do
  65.         if tk[i]=qk[j] then
  66.           if i=j then hit  := hit  + 1
  67.                  else blow := blow + 1
  68.   end {calcHB};
  69.  
  70. {********** 答えを入力 **********}
  71.   procedure InputAnswer ;
  72.   begin
  73.     gotoxy(19,1) ;
  74.     write('コンピュータの数は? (0を入れるとギブアップ) ') ;
  75.     repeat
  76.       gotoxy(19,45) ;writeln(' ':10) ; gotoxy(19,45) ;
  77.       readln(answer) ;
  78.       if answer=0 then   { ギブアップ }
  79.       begin
  80.         gotoxy(21,1) ;
  81.         write('コンピュータの数は',Number:4,'です。') ;
  82.         goto 999         { ゲーム終わり }
  83.       end
  84.     until (123<=answer) and (answer<=9876) and not chofuku(answer)
  85.   end {InputAnswer};
  86.  
  87. {********** 初期設定処理 **********}
  88.   procedure Init ;
  89.     var RD : integer ;  { 乱数発生のワーク }
  90.  
  91. {***** n 未満の乱数を乗算合同法で発生させる関数 ******}
  92.     function rand(n:integer): integer;
  93.       const MaxInteger = 32767 ;
  94.       var   i : integer;
  95.     begin
  96.       RD := RD * 259 ;
  97.       if RD > MaxInteger then  RD := RD mod MaxInteger ;
  98.       rand := RD mod n
  99.     end {rand};
  100.  
  101.   begin {Init}
  102.     repeat
  103.       write('乱数の初期値を入れて下さい(0以外) ?');
  104.       readln(RD)
  105.     until RD <> 0 ;
  106.     repeat
  107.       Number := rand(9999)
  108.     until not chofuku(Number) ;   { 重複しない数になるまで乱数を発生させる }
  109.  
  110.     page ;                        { タイトルと表を表示 }
  111.     writeln(' ':25,'** HIT & BLOW **');
  112.     writeln ;
  113.     writeln(' ':25,'回数: ????(hHbB)') ;
  114.     writeln(' ':25,'----------------') ;
  115.     time := 0                     { 回数クリア }
  116.   end {Init};
  117.  
  118. begin {main}
  119.   Init ;
  120.   repeat
  121.     InputAnswer ;
  122.     calcHB(Number,answer,H,B) ;  { HIT、BLOWを計算 }
  123.     time := time + 1  ;
  124.     gotoxy(time+4,26) ;          { 回数対応のところにカーソルを移動する }
  125.     writeln(time:4,':',answer:5,'(',H:1,'H',B:1,'B)');
  126.   until Number = answer ;
  127.   writeln(' ':25,'----- 正解 -----') ;
  128.  
  129.  999 :
  130. end.
  131.